package com.libraryManage.commons.utils;

import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

/**
 * Mybatis工具类
 * @author shou
 *
 */
public class PageUtil {

    /**
     * 生成排序（默认升序）
     *
     * @param orderBy
     * @return
     */
    public static String getSort(String orderBy) {

        return orderBy + " ASC";
    }

    /**
     * 生成排序（自定义升序降序）
     *
     * @param orderBy
     * @param sortord
     * @return
     */
    public static String getSort(String orderBy,String sortord) {

        return orderBy + " " + sortord;
    }

    /**
     * 设置分页参数
     *
     * @param pe
     */
    public static void startPage(PagingEntity pe) {

        String orderBy = pe.getOrderBy();

        if(StringUtils.isBlank(orderBy)){
            PageHelper.startPage(pe.getPageNum(),pe.getPageSize());
        }else{
            String sortord = pe.getSort();
            if(StringUtils.isBlank(sortord)){
                PageHelper.startPage(pe.getPageNum(),pe.getPageSize(),getSort(orderBy));
            }else{
                if("ASC".equalsIgnoreCase(sortord) || "DESC".equalsIgnoreCase(sortord)){
                    PageHelper.startPage(pe.getPageNum(),pe.getPageSize(),getSort(orderBy,sortord));
                }else{
                    throw new RuntimeException("排序方式不正确");
                }
            }
        }
    }

    /**
     * 设置分页参数
     *
     * @param map
     */
    public static void startPage(Map<String, Object> map) {

        String orderBy = (String) map.get("orderBy");

        if(StringUtils.isBlank(orderBy)){
            PageHelper.startPage(Integer.parseInt((String)map.get("pageNum")),
                    Integer.parseInt((String)map.get("pageSize")));
        }else{
            String sortord = (String) map.get("sortord");
            if(StringUtils.isBlank(sortord)){
                PageHelper.startPage(Integer.parseInt((String)map.get("pageNum")),
                        Integer.parseInt((String)map.get("pageSize")),getSort(orderBy));
            }else{
                if("ASC".equalsIgnoreCase(sortord) || "DESC".equalsIgnoreCase(sortord)){
                    PageHelper.startPage(Integer.parseInt((String)map.get("pageNum")),
                            Integer.parseInt((String)map.get("pageSize")),getSort(orderBy,sortord));
                }else{
                    throw new RuntimeException("排序方式不正确");
                }
            }
        }
    }

    /**
     * 转换mybatis分页结果为响应实体基类
     * @param list
     * @return
     */
    public static<T> ResponseEntity<List<T>> tranferPage(List<T> list){

        int total = 0;
        if(list != null && list.size() != 0){
            //获取分页信息
            PageInfo<?> pageInfo = new PageInfo<>(list);
            total = Integer.parseInt(String.valueOf(pageInfo.getTotal()));
        }

        return MVCUtil.resPaging(total, list);
    }

    /**
     * 手动分页解决mybatis结果集折叠问题
     * @param list
     * @param pageNum
     * @param pageSize
     * @return
     */
    public static<T> ResponseEntity<List<T>> manualPage(List<T> list,int pageNum,int pageSize){
        int total = 0;
        if(list != null && list.size() > 0){
            total = list.size();
            int maxRow = pageNum * pageSize;
            int startRow = maxRow - pageSize;
            if(maxRow <= total){
                list = list.subList(startRow, maxRow);
            }else if(maxRow > total){
                list = list.subList(startRow, total);
            }
        }
        return MVCUtil.resPaging(total, list);
    }
}
